package controllers

import models._
import play.api.data.Forms._
import play.api.data._
import play.api.mvc._
import play.api._
import services._

object AreasConhecimento extends Controller {

  def index = Action{ implicit request =>
    Ok(views.html.areasConhecimento.index(AreaConhecimentoService.list()))
  }
  
    
  def novo = Action{
    Ok(views.html.areasConhecimento.cadastrar(areaConhecimentoForm, AreaConhecimentoService.list().map(i => i.id.get.toString -> i.area)))
  }
  
  def cadastrar = Action{ implicit request =>
    areaConhecimentoForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.areasConhecimento.cadastrar(formError, AreaConhecimentoService.list().map(i => i.id.get.toString -> i.area)))},
      areaConhecimento => {
        AreaConhecimentoService.create(areaConhecimento)
        Redirect(routes.AreasConhecimento.index).flashing(("success","Área de Conhecimento Cadastrada com Sucesso"))
      }
    )
  }
  
  def editar(areaConhecimentoId: Int) = Action {
    val areaConhecimento = AreaConhecimentoService.getById(areaConhecimentoId)
    Ok(views.html.areasConhecimento.editar(areaConhecimentoForm.fill(areaConhecimento), AreaConhecimentoService.list().map(i => i.id.get.toString -> i.area)))
  }
  
  def atualizar(areaConhecimentoId: Int) = Action { implicit request =>
      areaConhecimentoForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.areasConhecimento.editar(formError, AreaConhecimentoService.list().map(i => i.id.get.toString -> i.area)))},
      areaConhecimento => {
        AreaConhecimentoService.update(areaConhecimento)
        Redirect(routes.AreasConhecimento.index).flashing(("success","Área de Conhecimento Atualizada com Sucesso"))
      }
    )
  }
  
  def excluir(areaConhecimentoId: Int) = Action{
    AreaConhecimentoService.delete(areaConhecimentoId)
    Redirect(routes.AreasConhecimento.index).flashing(("success","Área de Conhecimento Excluido com Sucesso"))
  }


  val areaConhecimentoForm = Form(
	mapping(
	  "id" -> optional(number),
      "area" -> nonEmptyText,
      "descricao" -> text,
      "idAreaConhecimentoPai" -> optional(number)
	)((id, area, descricao, idAreaConhecimentoPai) => AreaConhecimento(id, area, descricao, if(idAreaConhecimentoPai != None) Some(AreaConhecimentoService.getById(idAreaConhecimentoPai.get)) else None))
	 ((area: AreaConhecimento) => Option(area.id, area.area, area.descricao, if(area.areaConhecimentoPai != None) area.areaConhecimentoPai.get.id else None))
    )
}